/**
 * 统一错误处理中间件
 * 用于捕获并处理API请求过程中的各种错误
 */
const errorHandler = (err, req, res, next) => {
  // 记录错误详情到控制台
  console.error('错误详情:', err);
  
  // 区分不同类型的错误
  if (err.name === 'ValidationError') {
    return res.status(400).json({
      error: '数据验证失败',
      details: Object.values(err.errors).map(e => e.message)
    });
  }
  
  if (err.name === 'CastError' && err.kind === 'ObjectId') {
    return res.status(404).json({ error: '找不到请求的资源' });
  }
  
  if (err.code === 11000) { // MongoDB 重复键错误
    return res.status(409).json({ error: '资源已存在' });
  }
  
  if (err.name === 'JsonWebTokenError') {
    return res.status(401).json({ error: '无效的认证令牌' });
  }
  
  if (err.name === 'TokenExpiredError') {
    return res.status(401).json({ error: '认证令牌已过期' });
  }
  
  // 文件上传错误
  if (err.code === 'LIMIT_FILE_SIZE') {
    return res.status(400).json({ error: '文件大小超出限制' });
  }
  
  if (err.code === 'LIMIT_UNEXPECTED_FILE') {
    return res.status(400).json({ error: '未预期的文件字段' });
  }
  
  // 默认服务器错误
  res.status(err.statusCode || 500).json({
    error: err.message || '服务器内部错误',
    path: req.path
  });
};

module.exports = errorHandler;